#include "lcd.h"
#include "lcdfont.h"


#define delay_ms(X) delay_cycles(((CPUCLK_FREQ / 1000) * (X)))

void spi_write_bus(unsigned char dat) {
  // 发送数据
  DL_SPI_transmitData8(SPI_LCD_INST, dat);
  // 等待SPI总线空闲
  while (DL_SPI_isBusy(SPI_LCD_INST))
    ;
}

void LCD_Writ_Bus(unsigned char dat) {
  LCD_CS_Clr();
  spi_write_bus(dat);
  LCD_CS_Set();
}
void LCD_WR_DATA8(unsigned char dat) { LCD_Writ_Bus(dat); }
void LCD_WR_DATA(unsigned int dat) {
  LCD_Writ_Bus(dat >> 8);
  LCD_Writ_Bus(dat);
}
void LCD_WR_REG(unsigned char dat) {
  LCD_DC_Clr(); // 写命令
  LCD_Writ_Bus(dat);
  LCD_DC_Set(); // 写数据
}
void LCD_Address_Set(unsigned int x1, unsigned int y1, unsigned int x2,
                     unsigned int y2) {
  LCD_WR_REG(0x2a); // 列地址设置
  LCD_WR_DATA(x1);
  LCD_WR_DATA(x2);
  LCD_WR_REG(0x2b); // 行地址设置
  LCD_WR_DATA(y1 + 35);
  LCD_WR_DATA(y2 + 35);
  LCD_WR_REG(0x2c); // 储存器写
}
void LCD_init(void) {
  /* GPIO已在图形化工具中初始化 */

  LCD_RES_Clr(); // 复位
  delay_ms(30);
  LCD_RES_Set();
  delay_ms(100);
  // LCD_BLK_Set();//打开背光
  // delay_ms(100);
  LCD_WR_REG(0x11);

  LCD_WR_REG(0x36);
  LCD_WR_DATA8(0x70);

  LCD_WR_REG(0x3A);
  LCD_WR_DATA8(0x05);

  LCD_WR_REG(0xB2);
  LCD_WR_DATA8(0x0C);
  LCD_WR_DATA8(0x0C);
  LCD_WR_DATA8(0x00);
  LCD_WR_DATA8(0x33);
  LCD_WR_DATA8(0x33);

  LCD_WR_REG(0xB7);
  LCD_WR_DATA8(0x35);

  LCD_WR_REG(0xBB);
  LCD_WR_DATA8(0x1A);

  LCD_WR_REG(0xC0);
  LCD_WR_DATA8(0x2C);

  LCD_WR_REG(0xC2);
  LCD_WR_DATA8(0x01);

  LCD_WR_REG(0xC3);
  LCD_WR_DATA8(0x0B);

  LCD_WR_REG(0xC4);
  LCD_WR_DATA8(0x20);

  LCD_WR_REG(0xC6);
  LCD_WR_DATA8(0x0F);

  LCD_WR_REG(0xD0);
  LCD_WR_DATA8(0xA4);
  LCD_WR_DATA8(0xA1);

  LCD_WR_REG(0x21);
  LCD_WR_REG(0xE0);
  LCD_WR_DATA8(0xF0);
  LCD_WR_DATA8(0x00);
  LCD_WR_DATA8(0x04);
  LCD_WR_DATA8(0x04);
  LCD_WR_DATA8(0x04);
  LCD_WR_DATA8(0x05);
  LCD_WR_DATA8(0x29);
  LCD_WR_DATA8(0x33);
  LCD_WR_DATA8(0x3E);
  LCD_WR_DATA8(0x38);
  LCD_WR_DATA8(0x12);
  LCD_WR_DATA8(0x12);
  LCD_WR_DATA8(0x28);
  LCD_WR_DATA8(0x30);

  LCD_WR_REG(0xE1);
  LCD_WR_DATA8(0xF0);
  LCD_WR_DATA8(0x07);
  LCD_WR_DATA8(0x0A);
  LCD_WR_DATA8(0x0D);
  LCD_WR_DATA8(0x0B);
  LCD_WR_DATA8(0x07);
  LCD_WR_DATA8(0x28);
  LCD_WR_DATA8(0x33);
  LCD_WR_DATA8(0x3E);
  LCD_WR_DATA8(0x36);
  LCD_WR_DATA8(0x14);
  LCD_WR_DATA8(0x14);
  LCD_WR_DATA8(0x29);
  LCD_WR_DATA8(0x32);
  LCD_WR_REG(0x11);
  delay_ms(120);
  LCD_WR_REG(0x29);
}
/*******************************************************************************
 以下为基础UI部分
*******************************************************************************/

/******************************************************************************
      函数说明：在指定区域填充颜色
      入口数据：xsta,ysta   起始坐标
                xend,yend   终止坐标
                                                                color
要填充的颜色 返回值：  无
******************************************************************************/
void LCD_Fill(unsigned int xsta, unsigned int ysta, unsigned int xend,
              unsigned int yend, unsigned int color) {
  unsigned int i, j;
  LCD_Address_Set(xsta, ysta, xend - 1, yend - 1); // 设置显示范围
  for (i = ysta; i < yend; i++) {
    for (j = xsta; j < xend; j++) {
      LCD_WR_DATA(color);
    }
  }
}

/******************************************************************************
      函数说明：在指定位置画点
      入口数据：x,y 画点坐标
                color 点的颜色
      返回值：  无
******************************************************************************/
void LCD_DrawPoint(unsigned int x, unsigned int y, unsigned int color) {
  LCD_Address_Set(x, y, x, y); // 设置光标位置
  LCD_WR_DATA(color);
}

/******************************************************************************
      函数说明：画线
      入口数据：x1,y1   起始坐标
                x2,y2   终止坐标
                color   线的颜色
      返回值：  无
******************************************************************************/
void LCD_DrawLine(unsigned int x1, unsigned int y1, unsigned int x2,
                  unsigned int y2, unsigned int color) {
  unsigned int t;
  int xerr = 0, yerr = 0, delta_x, delta_y, distance;
  int incx, incy, uRow, uCol;
  delta_x = x2 - x1; // 计算坐标增量
  delta_y = y2 - y1;
  uRow = x1; // 画线起点坐标
  uCol = y1;
  if (delta_x > 0)
    incx = 1; // 设置单步方向
  else if (delta_x == 0)
    incx = 0; // 垂直线
  else {
    incx = -1;
    delta_x = -delta_x;
  }
  if (delta_y > 0)
    incy = 1;
  else if (delta_y == 0)
    incy = 0; // 水平线
  else {
    incy = -1;
    delta_y = -delta_y;
  }
  if (delta_x > delta_y)
    distance = delta_x; // 选取基本增量坐标轴
  else
    distance = delta_y;
  for (t = 0; t < distance + 1; t++) {
    LCD_DrawPoint(uRow, uCol, color); // 画点
    xerr += delta_x;
    yerr += delta_y;
    if (xerr > distance) {
      xerr -= distance;
      uRow += incx;
    }
    if (yerr > distance) {
      yerr -= distance;
      uCol += incy;
    }
  }
}

// 绘制垂直线
void LCD_DrawVerrticalLine(int x, int y1, int y2, unsigned int color) {
  int i;
  LCD_Address_Set(x, y1, x, y1 + y2);
  for (i = y1; i <= y1 + y2; i++) {
    LCD_WR_DATA(color);
  }
}
/******************************************************************************
      函数说明：画矩形
      入口数据：x1,y1   起始坐标
                x2,y2   终止坐标
                color   矩形的颜色
      返回值：  无
******************************************************************************/
void LCD_DrawRectangle(unsigned int x1, unsigned int y1, unsigned int x2,
                       unsigned int y2, unsigned int color) {
  LCD_DrawLine(x1, y1, x2, y1, color);
  LCD_DrawLine(x1, y1, x1, y2, color);
  LCD_DrawLine(x1, y2, x2, y2, color);
  LCD_DrawLine(x2, y1, x2, y2, color);
}

/******************************************************************************
      函数说明：画圆
      入口数据：x0,y0   圆心坐标
                r       半径
                color   圆的颜色
      返回值：  无
******************************************************************************/
void Draw_Circle(unsigned int x0, unsigned int y0, unsigned char r,
                 unsigned int color) {
  int a, b;
  a = 0;
  b = r;
  while (a <= b) {
    LCD_DrawPoint(x0 - b, y0 - a, color); // 3
    LCD_DrawPoint(x0 + b, y0 - a, color); // 0
    LCD_DrawPoint(x0 - a, y0 + b, color); // 1
    LCD_DrawPoint(x0 - a, y0 - b, color); // 2
    LCD_DrawPoint(x0 + b, y0 + a, color); // 4
    LCD_DrawPoint(x0 + a, y0 - b, color); // 5
    LCD_DrawPoint(x0 + a, y0 + b, color); // 6
    LCD_DrawPoint(x0 - b, y0 + a, color); // 7
    a++;
    if ((a * a + b * b) > (r * r)) // 判断要画的点是否过远
    {
      b--;
    }
  }
}

void Drawarc(int x, int y, int a, int b, unsigned int r, unsigned int c) {
  int x_tp, y_tp;
  int d; // Decision variable

  // Start with the top and bottom rows of the circle
  for (x_tp = 0; x_tp <= r; x_tp++) {
    // Calculate the corresponding y values
    y_tp = (int)sqrt(r * r - x_tp * x_tp);

    // Draw the horizontal lines from the circle edge to the center
    for (int i = x_tp; i >= -x_tp; i--) {
      LCD_DrawPoint(x + i, y - y_tp, c);
      LCD_DrawPoint(x + i, y + y_tp, c);
    }
  }

  // Now fill the rest of the circle
  d = 3 - 2 * r;
  while (x_tp > y_tp) {
    if (d < 0) {
      d += 4 * x_tp + 6;
    } else {
      d += 4 * (x_tp - y_tp) + 10;
      y_tp++;
    }
    x_tp--;

    // Draw the horizontal lines from the circle edge to the center
    for (int i = -x_tp; i <= x_tp; i++) {
      LCD_DrawPoint(x + i, y - y_tp, c);
      LCD_DrawPoint(x + i, y + y_tp, c);
    }

    // Draw the vertical lines from the circle edge to the center
    for (int i = -y_tp; i <= y_tp; i++) {
      LCD_DrawPoint(x + x_tp, y + i, c);
      LCD_DrawPoint(x - x_tp, y + i, c);
    }
  }
}

void LCD_ArcRect(unsigned int xsta, unsigned int ysta, unsigned int xend,
                 unsigned int yend, unsigned int color) {

  int r = 4;
  // 画四条边
  LCD_DrawLine(xsta + r, ysta, xend - r, ysta, color);
  LCD_DrawLine(xsta, ysta + r, xsta, yend - r, color);
  LCD_DrawLine(xsta + r, yend, xend - r, yend, color);
  LCD_DrawLine(xend, ysta + r, xend, yend - r, color);

  // 再画四个圆角
  Drawarc(xsta + r, ysta + r, 90, 180, r, color);  // 左上
  Drawarc(xend - r, ysta + r, 0, 90, r, color);    // 右上
  Drawarc(xsta + r, yend - r, 180, 270, r, color); // 左下
  Drawarc(xend - r, yend - r, 270, 360, r, color); // 右下

  // 画五个实心矩形
  LCD_Fill(xsta + r, ysta, xend - r, ysta + r, color);     // 上
  LCD_Fill(xend - r, ysta + r, xend, yend - r, color);     // 右
  LCD_Fill(xsta + r, yend - r, xend - r, yend, color);     // 下
  LCD_Fill(xsta, ysta + r, xsta + r, yend - r, color);     // 左
  LCD_Fill(xsta + r, ysta + r, xend - r, yend - r, color); // 中
}

/******************************************************************************
      函数说明：显示中英文字符串
      入口数据：x,y显示坐标
                *s 要显示的汉字串
                fc 字的颜色
                bc 字的背景色
                sizey 字号 可选 16 24 32
                mode:  0非叠加模式  1叠加模式
      返回值：  无
******************************************************************************/
void LCD_ShowChinese(unsigned int x, unsigned int y, unsigned char *s,
                     unsigned int fc, unsigned int bc, unsigned char sizey,
                     unsigned char mode) {
  while (*s != 0) {
    if (*s >= 128) {
      if (sizey == 12)
        LCD_ShowChinese12x12(x, y, s, fc, bc, sizey, mode);
      else if (sizey == 16)
        LCD_ShowChinese16x16(x, y, s, fc, bc, sizey, mode);
      else if (sizey == 24)
        LCD_ShowChinese24x24(x, y, s, fc, bc, sizey, mode);
      else if (sizey == 32)
        LCD_ShowChinese32x32(x, y, s, fc, bc, sizey, mode);
      else
        return;
      s += 3;
      x += sizey;
    } else {
      LCD_ShowChar(x, y, *s, fc, bc, sizey, mode);
      s += 1;
      x += (sizey / 2);
    }
  }
}

/******************************************************************************
      函数说明：显示单个12x12汉字
      入口数据：x,y显示坐标
                *s 要显示的汉字
                fc 字的颜色
                bc 字的背景色
                sizey 字号
                mode:  0非叠加模式  1叠加模式
      返回值：  无
******************************************************************************/
void LCD_ShowChinese12x12(unsigned int x, unsigned int y, unsigned char *s,
                          unsigned int fc, unsigned int bc, unsigned char sizey,
                          unsigned char mode) {
  unsigned char i, j, m = 0;
  unsigned int k;
  unsigned int HZnum;       // 汉字数目
  unsigned int TypefaceNum; // 一个字符所占字节大小
  unsigned int x0 = x;
  TypefaceNum = (sizey / 8 + ((sizey % 8) ? 1 : 0)) * sizey;

  HZnum = sizeof(tfont12) / sizeof(typFNT_GB12); // 统计汉字数目
  for (k = 0; k < HZnum; k++) {
    if ((tfont12[k].Index[0] == *(s)) && (tfont12[k].Index[1] == *(s + 1))) {
      LCD_Address_Set(x, y, x + sizey - 1, y + sizey - 1);
      for (i = 0; i < TypefaceNum; i++) {
        for (j = 0; j < 8; j++) {
          if (!mode) // 非叠加方式
          {
            if (tfont12[k].Msk[i] & (0x01 << j))
              LCD_WR_DATA(fc);
            else
              LCD_WR_DATA(bc);
            m++;
            if (m % sizey == 0) {
              m = 0;
              break;
            }
          } else // 叠加方式
          {
            if (tfont12[k].Msk[i] & (0x01 << j))
              LCD_DrawPoint(x, y, fc); // 画一个点
            x++;
            if ((x - x0) == sizey) {
              x = x0;
              y++;
              break;
            }
          }
        }
      }
    }
    continue; // 查找到对应点阵字库立即退出，防止多个汉字重复取模带来影响
  }
}

/******************************************************************************
      函数说明：显示单个16x16汉字
      入口数据：x,y显示坐标
                *s 要显示的汉字
                fc 字的颜色
                bc 字的背景色
                sizey 字号
                mode:  0非叠加模式  1叠加模式
      返回值：  无
******************************************************************************/
void LCD_ShowChinese16x16(unsigned int x, unsigned int y, unsigned char *s,
                          unsigned int fc, unsigned int bc, unsigned char sizey,
                          unsigned char mode) {
  unsigned char i, j, m = 0;
  unsigned int k;
  unsigned int HZnum;       // 汉字数目
  unsigned int TypefaceNum; // 一个字符所占字节大小
  unsigned int x0 = x;
  TypefaceNum = (sizey / 8 + ((sizey % 8) ? 1 : 0)) * sizey; // 32
  HZnum = sizeof(tfont16) / sizeof(typFNT_GB16); // 统计汉字数目
  for (k = 0; k < HZnum; k++) {
    if ((tfont16[k].Index[0] == *(s)) && (tfont16[k].Index[1] == *(s + 1))) {
      LCD_Address_Set(x, y, x + sizey - 1, y + sizey - 1);
      for (i = 0; i < TypefaceNum; i++) {
        for (j = 0; j < 8; j++) {
          if (!mode) // 非叠加方式
          {
            if (tfont16[k].Msk[i] & (0x01 << j))
              LCD_WR_DATA(fc);
            else
              LCD_WR_DATA(bc);
            m++;
            if (m % sizey == 0) {
              m = 0;
              break;
            }
          } else // 叠加方式
          {
            if (tfont16[k].Msk[i] & (0x01 << j))
              LCD_DrawPoint(x, y, fc); // 画一个点
            x++;
            if ((x - x0) == sizey) {
              x = x0;
              y++;
              break;
            }
          }
        }
      }
    }
    continue; // 查找到对应点阵字库立即退出，防止多个汉字重复取模带来影响
  }
}

/******************************************************************************
      函数说明：显示单个24x24汉字
      入口数据：x,y显示坐标
                *s 要显示的汉字
                fc 字的颜色
                bc 字的背景色
                sizey 字号
                mode:  0非叠加模式  1叠加模式
      返回值：  无
******************************************************************************/
void LCD_ShowChinese24x24(unsigned int x, unsigned int y, unsigned char *s,
                          unsigned int fc, unsigned int bc, unsigned char sizey,
                          unsigned char mode) {
  unsigned char i, j, m = 0;
  unsigned int k;
  unsigned int HZnum;       // 汉字数目
  unsigned int TypefaceNum; // 一个字符所占字节大小
  unsigned int x0 = x;
  TypefaceNum = (sizey / 8 + ((sizey % 8) ? 1 : 0)) * sizey;
  HZnum = sizeof(tfont24) / sizeof(typFNT_GB24); // 统计汉字数目
  for (k = 0; k < HZnum; k++) {
    if ((tfont24[k].Index[0] == *(s)) && (tfont24[k].Index[1] == *(s + 1))) {
      LCD_Address_Set(x, y, x + sizey - 1, y + sizey - 1);
      for (i = 0; i < TypefaceNum; i++) {
        for (j = 0; j < 8; j++) {
          if (!mode) // 非叠加方式
          {
            if (tfont24[k].Msk[i] & (0x01 << j))
              LCD_WR_DATA(fc);
            else
              LCD_WR_DATA(bc);
            m++;
            if (m % sizey == 0) {
              m = 0;
              break;
            }
          } else // 叠加方式
          {
            if (tfont24[k].Msk[i] & (0x01 << j))
              LCD_DrawPoint(x, y, fc); // 画一个点
            x++;
            if ((x - x0) == sizey) {
              x = x0;
              y++;
              break;
            }
          }
        }
      }
    }
    continue; // 查找到对应点阵字库立即退出，防止多个汉字重复取模带来影响
  }
}

/******************************************************************************
      函数说明：显示单个32x32汉字
      入口数据：x,y显示坐标
                *s 要显示的汉字
                fc 字的颜色
                bc 字的背景色
                sizey 字号
                mode:  0非叠加模式  1叠加模式
      返回值：  无
******************************************************************************/
void LCD_ShowChinese32x32(unsigned int x, unsigned int y, unsigned char *s,
                          unsigned int fc, unsigned int bc, unsigned char sizey,
                          unsigned char mode) {
  unsigned char i, j, m = 0;
  unsigned int k;
  unsigned int HZnum;       // 汉字数目
  unsigned int TypefaceNum; // 一个字符所占字节大小
  unsigned int x0 = x;
  TypefaceNum = (sizey / 8 + ((sizey % 8) ? 1 : 0)) * sizey;
  HZnum = sizeof(tfont32) / sizeof(typFNT_GB32); // 统计汉字数目
  for (k = 0; k < HZnum; k++) {
    if ((tfont32[k].Index[0] == *(s)) && (tfont32[k].Index[1] == *(s + 1))) {
      LCD_Address_Set(x, y, x + sizey - 1, y + sizey - 1);
      for (i = 0; i < TypefaceNum; i++) {
        for (j = 0; j < 8; j++) {
          if (!mode) // 非叠加方式
          {
            if (tfont32[k].Msk[i] & (0x01 << j))
              LCD_WR_DATA(fc);
            else
              LCD_WR_DATA(bc);
            m++;
            if (m % sizey == 0) {
              m = 0;
              break;
            }
          } else // 叠加方式
          {
            if (tfont32[k].Msk[i] & (0x01 << j))
              LCD_DrawPoint(x, y, fc); // 画一个点
            x++;
            if ((x - x0) == sizey) {
              x = x0;
              y++;
              break;
            }
          }
        }
      }
    }
    continue; // 查找到对应点阵字库立即退出，防止多个汉字重复取模带来影响
  }
}

/******************************************************************************
      函数说明：显示单个字符
      入口数据：x,y显示坐标
                num 要显示的字符
                fc 字的颜色
                bc 字的背景色
                sizey 字号
                mode:  0非叠加模式  1叠加模式
      返回值：  无
******************************************************************************/
void LCD_ShowChar(unsigned int x, unsigned int y, unsigned char num,
                  unsigned int fc, unsigned int bc, unsigned char sizey,
                  unsigned char mode) {
  unsigned char temp, sizex, t, m = 0;
  unsigned int i, TypefaceNum; // 一个字符所占字节大小
  unsigned int x0 = x;
  sizex = sizey / 2;
  TypefaceNum = (sizex / 8 + ((sizex % 8) ? 1 : 0)) * sizey;
  num = num - ' ';                                     // 得到偏移后的值
  LCD_Address_Set(x, y, x + sizex - 1, y + sizey - 1); // 设置光标位置
  for (i = 0; i < TypefaceNum; i++) {
    if (sizey == 12)
      temp = ascii_1206[num][i]; // 调用6x12字体
    else if (sizey == 16)
      temp = ascii_1608[num][i]; // 调用8x16字体
    else if (sizey == 24)
      temp = ascii_2412[num][i]; // 调用12x24字体
    else if (sizey == 32)
      temp = ascii_3216[num][i]; // 调用16x32字体
    else
      return;
    for (t = 0; t < 8; t++) {
      if (!mode) // 非叠加模式
      {
        if (temp & (0x01 << t))
          LCD_WR_DATA(fc);
        else
          LCD_WR_DATA(bc);
        m++;
        if (m % sizex == 0) {
          m = 0;
          break;
        }
      } else // 叠加模式
      {
        if (temp & (0x01 << t))
          LCD_DrawPoint(x, y, fc); // 画一个点
        x++;
        if ((x - x0) == sizex) {
          x = x0;
          y++;
          break;
        }
      }
    }
  }
}

/******************************************************************************
      函数说明：显示字符串
      入口数据：x,y显示坐标
                *p 要显示的字符串
                fc 字的颜色
                bc 字的背景色
                sizey 字号
                mode:  0非叠加模式  1叠加模式
      返回值：  无
******************************************************************************/
void LCD_ShowString(unsigned int x, unsigned int y, const unsigned char *p,
                    unsigned int fc, unsigned int bc, unsigned char sizey,
                    unsigned char mode) {
  while (*p != '\0') {
    LCD_ShowChar(x, y, *p, fc, bc, sizey, mode);
    x += sizey / 2;
    p++;
  }
}

/******************************************************************************
      函数说明：显示数字
      入口数据：m底数，n指数
      返回值：  无
******************************************************************************/
unsigned int mypow(unsigned char m, unsigned char n) {
  unsigned int result = 1;
  while (n--)
    result *= m;
  return result;
}

/******************************************************************************
      函数说明：显示整数变量
      入口数据：x,y显示坐标
                num 要显示整数变量
                len 要显示的位数
                fc 字的颜色
                bc 字的背景色
                sizey 字号
      返回值：  无
******************************************************************************/
void LCD_ShowIntNum(unsigned int x, unsigned int y, unsigned int num,
                    unsigned char len, unsigned int fc, unsigned int bc,
                    unsigned char sizey) {
  unsigned char t, temp;
  unsigned char enshow = 0;
  unsigned char sizex = sizey / 2;
  for (t = 0; t < len; t++) {
    temp = (num / mypow(10, len - t - 1)) % 10;
    if (enshow == 0 && t < (len - 1)) {
      if (temp == 0) {
        LCD_ShowChar(x + t * sizex, y, ' ', fc, bc, sizey, 0);
        continue;
      } else
        enshow = 1;
    }
    LCD_ShowChar(x + t * sizex, y, temp + 48, fc, bc, sizey, 0);
  }
}

/******************************************************************************
      函数说明：显示两位小数变量
      入口数据：x,y显示坐标
                num 要显示小数变量
                len 要显示的位数
                fc 字的颜色
                bc 字的背景色
                sizey 字号
      返回值：  无
******************************************************************************/
void LCD_ShowFloatNum1(unsigned int x, unsigned int y, float num,
                       unsigned char len, unsigned int fc, unsigned int bc,
                       unsigned char sizey) {
  unsigned char t, temp, sizex;
  unsigned int num1;
  sizex = sizey / 2;
  num1 = num * 100;
  for (t = 0; t < len; t++) {
    temp = (num1 / mypow(10, len - t - 1)) % 10;
    if (t == (len - 2)) {
      LCD_ShowChar(x + (len - 2) * sizex, y, '.', fc, bc, sizey, 0);
      t++;
      len += 1;
    }
    LCD_ShowChar(x + t * sizex, y, temp + 48, fc, bc, sizey, 0);
  }
}

/******************************************************************************
      函数说明：显示图片
      入口数据：x,y起点坐标
                length 图片长度
                width  图片宽度
                pic[]  图片数组
      返回值：  无
******************************************************************************/
void LCD_ShowPicture(unsigned int x, unsigned int y, unsigned int length,
                     unsigned int width, const unsigned char pic[]) {
  unsigned int i, j;
  uint32_t k = 0;
  LCD_Address_Set(x, y, x + length - 1, y + width - 1);
  for (i = 0; i < length; i++) {
    for (j = 0; j < width; j++) {
      LCD_WR_DATA8(pic[k * 2]);
      LCD_WR_DATA8(pic[k * 2 + 1]);
      k++;
    }
  }
}